package com.ecloud.common.data.handler;

import org.aspectj.lang.JoinPoint;

/**
 * 责任链模式处理器 用于决定数据源
 *
 * @author LiuGangQiang Create in 2021/04/30
 */
public abstract class DynamicDSHandler {
    /**
     * 下一个处理器
     *
     * @author LiuGangQiang Create in 2021/04/30
     */
    private DynamicDSHandler next;

    public void setNext(DynamicDSHandler next) {
        this.next = next;
    }

    /**
     * 决定数据源
     *
     * @author LiuGangQiang Create in 2021/04/30
     * @param point 切点
     * @param key   DynamicDS注解内的内容
     * @return {@link String}
     */
    public String resolve(JoinPoint point, String key) {
        if (matches(key)) {
            /* 这里可以增加判断 当返回为空且存在下一个处理器时继续传递,但得注意使用场景是否会导致不必要的问题 */
            return analysis(point, key);
        }
        if (next != null) {
            return next.resolve(point, key);
        }
        return null;
    }

    /**
     * 匹配逻辑,只有被匹配的才会执行当前处理器
     *
     * @author LiuGangQiang Create in 2021/04/30
     * @param key DynamicDS注解内的内容
     * @return {@link Boolean}
     */
    public abstract boolean matches(String key);

    /**
     * 解析注解内容并转换为目标值
     *
     * @author LiuGangQiang Create in 2021/04/30
     * @param point 切点
     * @param key   DynamicDS注解内的内容
     * @return {@link String}
     */
    public abstract String analysis(JoinPoint point, String key);
}
